/*
 * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package javax.swing.plaf.metal;

import javax.swing.plaf.*;
import javax.swing.*;

/**
 * {@code MetalTheme} provides the color palette and fonts used by
 * the Java Look and Feel.
 * <p>
 * {@code MetalTheme} is abstract, see {@code DefaultMetalTheme} and
 * {@code OceanTheme} for concrete implementations.
 * <p>
 * {@code MetalLookAndFeel} maintains the current theme that the
 * the {@code ComponentUI} implementations for metal use. Refer to
 * {@link MetalLookAndFeel#setCurrentTheme
 * MetalLookAndFeel.setCurrentTheme(MetalTheme)} for details on changing
 * the current theme.
 * <p>
 * {@code MetalTheme} provides a number of public methods for getting
 * colors. These methods are implemented in terms of a
 * handful of protected abstract methods. A subclass need only override
 * the protected abstract methods ({@code getPrimary1},
 * {@code getPrimary2}, {@code getPrimary3}, {@code getSecondary1},
 * {@code getSecondary2}, and {@code getSecondary3}); although a subclass
 * may override the other public methods for more control over the set of
 * colors that are used.
 * <p>
 * Concrete implementations of {@code MetalTheme} must return {@code non-null}
 * values from all methods. While the behavior of returning {@code null} is
 * not specified, returning {@code null} will result in incorrect behavior.
 * <p>
 * It is strongly recommended that subclasses return completely opaque colors.
 * To do otherwise may result in rendering problems, such as visual garbage.
 *
 * @author Steve Wilson
 * @see DefaultMetalTheme
 * @see OceanTheme
 * @see MetalLookAndFeel#setCurrentTheme
 */
public abstract class MetalTheme {

  // Contants identifying the various Fonts that are Theme can support
  static final int CONTROL_TEXT_FONT = 0;
  static final int SYSTEM_TEXT_FONT = 1;
  static final int USER_TEXT_FONT = 2;
  static final int MENU_TEXT_FONT = 3;
  static final int WINDOW_TITLE_FONT = 4;
  static final int SUB_TEXT_FONT = 5;

  static ColorUIResource white = new ColorUIResource(255, 255, 255);
  private static ColorUIResource black = new ColorUIResource(0, 0, 0);

  /**
   * Returns the name of this theme.
   *
   * @return the name of this theme
   */
  public abstract String getName();

  /**
   * Returns the primary 1 color.
   *
   * @return the primary 1 color
   */
  protected abstract ColorUIResource getPrimary1();  // these are blue in Metal Default Theme

  /**
   * Returns the primary 2 color.
   *
   * @return the primary 2 color
   */
  protected abstract ColorUIResource getPrimary2();

  /**
   * Returns the primary 3 color.
   *
   * @return the primary 3 color
   */
  protected abstract ColorUIResource getPrimary3();

  /**
   * Returns the secondary 1 color.
   *
   * @return the secondary 1 color
   */
  protected abstract ColorUIResource getSecondary1();  // these are gray in Metal Default Theme

  /**
   * Returns the secondary 2 color.
   *
   * @return the secondary 2 color
   */
  protected abstract ColorUIResource getSecondary2();

  /**
   * Returns the secondary 3 color.
   *
   * @return the secondary 3 color
   */
  protected abstract ColorUIResource getSecondary3();

  /**
   * Returns the control text font.
   *
   * @return the control text font
   */
  public abstract FontUIResource getControlTextFont();

  /**
   * Returns the system text font.
   *
   * @return the system text font
   */
  public abstract FontUIResource getSystemTextFont();

  /**
   * Returns the user text font.
   *
   * @return the user text font
   */
  public abstract FontUIResource getUserTextFont();

  /**
   * Returns the menu text font.
   *
   * @return the menu text font
   */
  public abstract FontUIResource getMenuTextFont();

  /**
   * Returns the window title font.
   *
   * @return the window title font
   */
  public abstract FontUIResource getWindowTitleFont();

  /**
   * Returns the sub-text font.
   *
   * @return the sub-text font
   */
  public abstract FontUIResource getSubTextFont();

  /**
   * Returns the white color. This returns opaque white
   * ({@code 0xFFFFFFFF}).
   *
   * @return the white color
   */
  protected ColorUIResource getWhite() {
    return white;
  }

  /**
   * Returns the black color. This returns opaque black
   * ({@code 0xFF000000}).
   *
   * @return the black color
   */
  protected ColorUIResource getBlack() {
    return black;
  }

  /**
   * Returns the focus color. This returns the value of
   * {@code getPrimary2()}.
   *
   * @return the focus color
   */
  public ColorUIResource getFocusColor() {
    return getPrimary2();
  }

  /**
   * Returns the desktop color. This returns the value of
   * {@code getPrimary2()}.
   *
   * @return the desktop color
   */
  public ColorUIResource getDesktopColor() {
    return getPrimary2();
  }

  /**
   * Returns the control color. This returns the value of
   * {@code getSecondary3()}.
   *
   * @return the control color
   */
  public ColorUIResource getControl() {
    return getSecondary3();
  }

  /**
   * Returns the control shadow color. This returns
   * the value of {@code getSecondary2()}.
   *
   * @return the control shadow color
   */
  public ColorUIResource getControlShadow() {
    return getSecondary2();
  }

  /**
   * Returns the control dark shadow color. This returns
   * the value of {@code getSecondary1()}.
   *
   * @return the control dark shadow color
   */
  public ColorUIResource getControlDarkShadow() {
    return getSecondary1();
  }

  /**
   * Returns the control info color. This returns
   * the value of {@code getBlack()}.
   *
   * @return the control info color
   */
  public ColorUIResource getControlInfo() {
    return getBlack();
  }

  /**
   * Returns the control highlight color. This returns
   * the value of {@code getWhite()}.
   *
   * @return the control highlight color
   */
  public ColorUIResource getControlHighlight() {
    return getWhite();
  }

  /**
   * Returns the control disabled color. This returns
   * the value of {@code getSecondary2()}.
   *
   * @return the control disabled color
   */
  public ColorUIResource getControlDisabled() {
    return getSecondary2();
  }

  /**
   * Returns the primary control color. This returns
   * the value of {@code getPrimary3()}.
   *
   * @return the primary control color
   */
  public ColorUIResource getPrimaryControl() {
    return getPrimary3();
  }

  /**
   * Returns the primary control shadow color. This returns
   * the value of {@code getPrimary2()}.
   *
   * @return the primary control shadow color
   */
  public ColorUIResource getPrimaryControlShadow() {
    return getPrimary2();
  }

  /**
   * Returns the primary control dark shadow color. This
   * returns the value of {@code getPrimary1()}.
   *
   * @return the primary control dark shadow color
   */
  public ColorUIResource getPrimaryControlDarkShadow() {
    return getPrimary1();
  }

  /**
   * Returns the primary control info color. This
   * returns the value of {@code getBlack()}.
   *
   * @return the primary control info color
   */
  public ColorUIResource getPrimaryControlInfo() {
    return getBlack();
  }

  /**
   * Returns the primary control highlight color. This
   * returns the value of {@code getWhite()}.
   *
   * @return the primary control highlight color
   */
  public ColorUIResource getPrimaryControlHighlight() {
    return getWhite();
  }

  /**
   * Returns the system text color. This returns the value of
   * {@code getBlack()}.
   *
   * @return the system text color
   */
  public ColorUIResource getSystemTextColor() {
    return getBlack();
  }

  /**
   * Returns the control text color. This returns the value of
   * {@code getControlInfo()}.
   *
   * @return the control text color
   */
  public ColorUIResource getControlTextColor() {
    return getControlInfo();
  }

  /**
   * Returns the inactive control text color. This returns the value of
   * {@code getControlDisabled()}.
   *
   * @return the inactive control text color
   */
  public ColorUIResource getInactiveControlTextColor() {
    return getControlDisabled();
  }

  /**
   * Returns the inactive system text color. This returns the value of
   * {@code getSecondary2()}.
   *
   * @return the inactive system text color
   */
  public ColorUIResource getInactiveSystemTextColor() {
    return getSecondary2();
  }

  /**
   * Returns the user text color. This returns the value of
   * {@code getBlack()}.
   *
   * @return the user text color
   */
  public ColorUIResource getUserTextColor() {
    return getBlack();
  }

  /**
   * Returns the text highlight color. This returns the value of
   * {@code getPrimary3()}.
   *
   * @return the text highlight color
   */
  public ColorUIResource getTextHighlightColor() {
    return getPrimary3();
  }

  /**
   * Returns the highlighted text color. This returns the value of
   * {@code getControlTextColor()}.
   *
   * @return the highlighted text color
   */
  public ColorUIResource getHighlightedTextColor() {
    return getControlTextColor();
  }

  /**
   * Returns the window background color. This returns the value of
   * {@code getWhite()}.
   *
   * @return the window background color
   */
  public ColorUIResource getWindowBackground() {
    return getWhite();
  }

  /**
   * Returns the window title background color. This returns the value of
   * {@code getPrimary3()}.
   *
   * @return the window title background color
   */
  public ColorUIResource getWindowTitleBackground() {
    return getPrimary3();
  }

  /**
   * Returns the window title foreground color. This returns the value of
   * {@code getBlack()}.
   *
   * @return the window title foreground color
   */
  public ColorUIResource getWindowTitleForeground() {
    return getBlack();
  }

  /**
   * Returns the window title inactive background color. This
   * returns the value of {@code getSecondary3()}.
   *
   * @return the window title inactive background color
   */
  public ColorUIResource getWindowTitleInactiveBackground() {
    return getSecondary3();
  }

  /**
   * Returns the window title inactive foreground color. This
   * returns the value of {@code getBlack()}.
   *
   * @return the window title inactive foreground color
   */
  public ColorUIResource getWindowTitleInactiveForeground() {
    return getBlack();
  }

  /**
   * Returns the menu background color. This
   * returns the value of {@code getSecondary3()}.
   *
   * @return the menu background color
   */
  public ColorUIResource getMenuBackground() {
    return getSecondary3();
  }

  /**
   * Returns the menu foreground color. This
   * returns the value of {@code getBlack()}.
   *
   * @return the menu foreground color
   */
  public ColorUIResource getMenuForeground() {
    return getBlack();
  }

  /**
   * Returns the menu selected background color. This
   * returns the value of {@code getPrimary2()}.
   *
   * @return the menu selected background color
   */
  public ColorUIResource getMenuSelectedBackground() {
    return getPrimary2();
  }

  /**
   * Returns the menu selected foreground color. This
   * returns the value of {@code getBlack()}.
   *
   * @return the menu selected foreground color
   */
  public ColorUIResource getMenuSelectedForeground() {
    return getBlack();
  }

  /**
   * Returns the menu disabled foreground color. This
   * returns the value of {@code getSecondary2()}.
   *
   * @return the menu disabled foreground color
   */
  public ColorUIResource getMenuDisabledForeground() {
    return getSecondary2();
  }

  /**
   * Returns the separator background color. This
   * returns the value of {@code getWhite()}.
   *
   * @return the separator background color
   */
  public ColorUIResource getSeparatorBackground() {
    return getWhite();
  }

  /**
   * Returns the separator foreground color. This
   * returns the value of {@code getPrimary1()}.
   *
   * @return the separator foreground color
   */
  public ColorUIResource getSeparatorForeground() {
    return getPrimary1();
  }

  /**
   * Returns the accelerator foreground color. This
   * returns the value of {@code getPrimary1()}.
   *
   * @return the accelerator foreground color
   */
  public ColorUIResource getAcceleratorForeground() {
    return getPrimary1();
  }

  /**
   * Returns the accelerator selected foreground color. This
   * returns the value of {@code getBlack()}.
   *
   * @return the accelerator selected foreground color
   */
  public ColorUIResource getAcceleratorSelectedForeground() {
    return getBlack();
  }

  /**
   * Adds values specific to this theme to the defaults table. This method
   * is invoked when the look and feel defaults are obtained from
   * {@code MetalLookAndFeel}.
   * <p>
   * This implementation does nothing; it is provided for subclasses
   * that wish to customize the defaults table.
   *
   * @param table the {@code UIDefaults} to add the values to
   * @see MetalLookAndFeel#getDefaults
   */
  public void addCustomEntriesToTable(UIDefaults table) {
  }

  /**
   * This is invoked when a MetalLookAndFeel is installed and about to
   * start using this theme. When we can add API this should be nuked
   * in favor of DefaultMetalTheme overriding addCustomEntriesToTable.
   */
  void install() {
  }

  /**
   * Returns true if this is a theme provided by the core platform.
   */
  boolean isSystemTheme() {
    return false;
  }
}
